home *** CD-ROM | disk | FTP | other *** search
/ PC Media 22 / PC MEDIA CD22.iso / share / prog / spm220e / terminal.c < prev    next >
Text File  |  1995-09-13  |  59KB  |  1,970 lines

  1. /*
  2. ╔═════════════════════════════════════════════════════════════════════════════╗
  3. ║ NAME      : TERMINAL.C                                                      ║
  4. ║ FUNCTION  : A simple terminal emulator to show how to use STARCOMM.EXE when ║
  5. ║           : it is used as a DEVICE DRIVER.Uses the C interfacing procedures.║
  6. ║           : This emulator allows a direct link between two locals computers.║
  7. ║           : It may be used as a simple TTY emulator as well...              ║
  8. ║ VERSION   : v2.10                                                           ║
  9. ║ LANGAGE   : TURBO C version 1.0 and laters.                                 ║
  10. ║ SYNTAX    : (path)> <path_pgm>CHEKLINK [<comm format>] [<options>]          ║
  11. ║           :      <comm format>  = [COMi:][speed][,parity][,bits][,stop-bit] ║
  12. ║           :      <options>      =                                           ║
  13. ║           :        /T............... <T>erminal: full screen emulation.     ║
  14. ║           :        /A............... <A>larm has to ring on receipt errors. ║
  15. ║           :        /R ou /RALENTI... Strings are transmitted slowly.        ║
  16. ║           :                      (use that for very slow distants stations) ║
  17. ║ REMARKS   : TERMINAL will always use COM1 as the default serial port when   ║
  18. ║           : it is first executed. If this port doesn't exist or is unreacha-║
  19. ║           : -ble, or if the port specified in the command-line is unknown,  ║
  20. ║           : the first accessible serial port will be used. If there is not  ║
  21. ║           : any accessible serial port, TERMINAL immediately stops...       ║
  22. ║ COPYRIGHT : HETRU Fabrice 1991-1995.                                        ║
  23. ╚═════════════════════════════════════════════════════════════════════════════╝
  24. */
  25.  
  26.  
  27. /* ===== Headers, CONSTANTS and VARIABLES ===== */
  28.  
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <dos.h>
  32. #include <conio.h>
  33.  
  34. #include "STARINTF.C"
  35.  
  36.  
  37. #define byte     unsigned char
  38.  
  39.  
  40. #define Int1B     0x1B  /* BIOS interrupt number managing "Ctrl-Break".     */
  41. #define Int24     0x24  /* Criticals system errors interrupt handler.       */
  42. #define SHVL      0x100 /* Specials keys flag.                              */
  43. #define PARITE    1     /* Parity indicator.                                */
  44. #define NBOCTETS  2     /* Bytes number indicator.                          */
  45. #define STOPBIT   3     /* Stop-bit number indicator.                       */
  46. #define T_Delay   10    /* Delay length to slow down the transmissions.     */
  47. #define EOS       0     /* End Of String indicator.                         */
  48. #define FALSE     0     /* Logical FALSE...                                 */
  49. #define TRUE      1     /* Logical TRUE...                                  */
  50. #define StrLen    25    /* Maximum authorized size for the input strings.   */
  51. #define MAXStrLen StrLen+1
  52.  
  53.  
  54. /* Generals use variables. */
  55. char     commande[127];
  56. int      choix;
  57. byte     n_car;
  58. char     cr = 0x0D;
  59. char     clrscreen = 0x0C;
  60. byte     fin = FALSE;
  61. byte     Saisie_Escape = FALSE;
  62. byte     abandon = FALSE;
  63. word     IO_err = FALSE;
  64. /* Variables to manage the serial ports. */
  65. byte     ver[5] ;
  66. byte     voie = '1';
  67. byte     parity = 'N';
  68. byte     longueur = '8';
  69. byte     stop_bit = '1';
  70. long     vitesse = 9600;
  71. word     InBuffSz, OutBuffSz;
  72. word     engorge_err = 0;
  73. word     pari_err    = 0;
  74. word     stop_err    = 0;
  75. word     brkint      = 0;
  76. word     erreur;
  77. short    resul;
  78. byte     OldRdTimMAX = 0;
  79. byte     OldWrTimMAX = 0;
  80. byte     RdTimMAX[2] = {2,0};
  81. byte     WrTimMAX[2] = {2,0};
  82. byte     TimOut[2]   = {'1',0};
  83. div_t    result;
  84. byte     Lent = FALSE;
  85. char     echo = TRUE;
  86. byte     LF_Used = TRUE;
  87. byte     CR_Used = TRUE;
  88. /* Variables to manage the screen. */
  89. word     seg_ecran, off_ecran;
  90. word     mode_scr, page_scr;
  91. int      xh, yh;
  92. char     dos_scr[80 * 25 * 2];
  93. byte     terminal = FALSE;
  94.  
  95.  
  96. /* ===== INPUT/OUTPUT PROCEDURES ===== */
  97.  
  98. /* INTERRUPTS procedures to manage the local computer. */
  99. /* --------------------------------------------------- */
  100. void main_menu(); /* This procedure is used before beeing listed... */
  101.  
  102.  
  103. void interrupt (*OldIError) ();
  104.  
  105.  
  106. void interrupt IError()
  107.   {
  108.   int x0,y0;
  109.  
  110.   /* Error occurence flag is up-dated. */
  111.   IO_err = TRUE;  /* Seted back to FALSE before ReadCOMM and WriteCOMM... */
  112.   /* New process for the error handler. */
  113.   x0 = wherex(); y0 = wherey();
  114.   window(1,1,80,25);
  115.   gotoxy(1,25);
  116.   textbackground(WHITE);
  117.   textcolor(LIGHTRED);
  118.   clreol();
  119.   gotoxy(21,25);
  120.   switch(_DI)
  121.     {
  122.     case 0x0A: cputs("Writting time-out"); break;
  123.     case 0x0B: cputs("    Reading error");
  124.     }
  125.   cputs(" on the serial port");
  126.   delay(1000);
  127.   main_menu();
  128.   textbackground(BLUE);
  129.   if (! terminal)
  130.     {
  131.     if (y0<14) window(1,4,80,13);
  132.       else window(1,15,80,24);
  133.     }
  134.   else window(1,3,80,24);
  135.   gotoxy(x0,y0);
  136.   /* "interrupt" used to define the IError procedure makes PUSH:... */
  137.   /* The following code is to destroy these unwanted PUSHes !...    */
  138.   asm mov sp,bp
  139.   asm pop bp
  140.   asm pop di
  141.   asm pop si
  142.   asm pop ds
  143.   asm pop es
  144.   asm pop dx
  145.   asm pop cx
  146.   asm pop bx
  147.   asm pop ax
  148.   /* Get ready to return to the application without using the DOS. */
  149.   asm pop ax /* Unstacking what is associated to the IRET system call... */
  150.   asm pop ax /* CS:IP and Flags. */
  151.   asm pop ax
  152.   asm pop ax /* CPU protection. */
  153.   asm pop bx
  154.   asm pop cx
  155.   asm pop dx
  156.   asm pop si
  157.   asm pop di
  158.   asm pop bp
  159.   asm pop ds
  160.   asm pop es
  161.   enable();  /* STI, then IRET... */
  162.   asm iret
  163.   /* In assembler, then follow the POP made by TCC; They will never be
  164.      executed indeed !... (They all have been unstacked before...). */
  165.   }
  166.  
  167.  
  168. void interrupt (*OldIBreak) ();
  169.  
  170.  
  171. void interrupt CtrlBreak()
  172.   {
  173.   abandon = TRUE;
  174.   }
  175.  
  176.  
  177. /* Local consol management procedures. */
  178. /* ----------------------------------- */
  179. int kb_hit()
  180.   {
  181.   inregs.h.ah = 1;
  182.   int86(0x16,&inregs,&outregs);
  183.   return( !(outregs.x.flags & 64) );
  184.   }
  185.  
  186.  
  187. int get_clav()
  188.   {
  189.   int h,l;
  190.  
  191.   if (kb_hit())
  192.     {
  193.     inregs.h.ah = 0;
  194.     int86(0x16,&inregs,&outregs);
  195.     l = outregs.h.al;
  196.     h = outregs.h.ah;
  197.     if (l==0) l = h+SHVL;
  198.     if (l==3) abandon = TRUE;
  199.     return(l);
  200.     }
  201.   else return(0);
  202.   }
  203.  
  204.  
  205. void scroll_down()
  206.   {
  207.   char scroll[3];
  208.  
  209.   scroll[1] = 0x0A;
  210.   scroll[2] = 0x0D;
  211.   scroll[3] = EOS;
  212.   cputs(&scroll[1]);
  213.   }
  214.  
  215.  
  216. void blanchi(int x, int y, int l)
  217.   {
  218.   byte col;
  219.  
  220.   gotoxy(x,y);
  221.   for (col=x; col<=x+l-1; col++) cputs(" ");
  222.   gotoxy(x,y);
  223.   }
  224.  
  225.  
  226. void delete(char *ch,int pos,unsigned char Nb)
  227.   {
  228.   pos--;
  229.   while ( (pos+Nb<=MAXStrLen) & (*(ch+pos)!=EOS) )
  230.     {
  231.     *(ch+pos) = *(ch+pos+Nb);
  232.     pos++;
  233.     }
  234.   }
  235.  
  236.  
  237. void Insert(char car,char *Chaine,int pos)
  238.   {
  239.   int i,j;
  240.  
  241.   if (pos<1) pos = 1;
  242.   i = 0;
  243.   while ( (*(Chaine+i)!=0) & (i<strlen(Chaine)) ) i++;
  244.   if (i<StrLen)
  245.     {
  246.     i++;
  247.     for (j=i;j>=pos;j--) *(Chaine+j) = *(Chaine+j-1);
  248.     *(Chaine+j) = car;
  249.     }
  250.   }
  251.  
  252.  
  253. void back(char *ch,int x,int l)
  254.   {
  255.   int k,x2;
  256.  
  257.   k = 0;
  258.   x2 = wherex();
  259.   if (x==x2) k=1;
  260.   delete(ch,x2-x+k,1);
  261.   blanchi(x,wherey(),l);
  262.   cputs(ch);
  263.   gotoxy(x2+k-1,wherey());
  264.   }
  265.  
  266.  
  267. void vid(char *ch,int x,int y,int l)
  268.   {
  269.   blanchi(x,y,l);
  270.   strcpy(ch,"");
  271.   }
  272.  
  273.  
  274. void ReadCar(char *Car_lu,byte *Fonct_Touche)
  275.   {
  276.   int loc_car;
  277.  
  278.   Saisie_Escape = FALSE;
  279.   *Fonct_Touche = FALSE;
  280.   loc_car = 0;
  281.   *Car_lu = ' ';
  282.   while (!kb_hit());
  283.   if ( (loc_car=get_clav())>=SHVL )
  284.     {
  285.     *Fonct_Touche = TRUE;
  286.     *Car_lu = loc_car - SHVL;
  287.     }
  288.   else *Car_lu = toupper((char)loc_car);
  289.   if (*Car_lu==0x1B) Saisie_Escape = TRUE;
  290.   }
  291.  
  292.  
  293. void Lit_chaine(char *chaine,int x,int y,int l)
  294.   {
  295.   char LocalChaine[MAXStrLen];
  296.   char carac;
  297.   byte Fonct_Touche;
  298.   int oldx;
  299.  
  300.   textbackground(BLACK);
  301.   if (*chaine!=0)
  302.     {
  303.     strcpy(LocalChaine,chaine);
  304.     blanchi(x,y,l);
  305.     cputs(LocalChaine);
  306.     }
  307.   else vid(LocalChaine,x,y,l);
  308.   do
  309.     {
  310.     ReadCar(&carac,&Fonct_Touche);
  311.     if (!Fonct_Touche)
  312.       {
  313.       if (carac==0x08)
  314.         {
  315.         if (strlen(LocalChaine)<l) back(LocalChaine,x,l);
  316.           else
  317.             {
  318.             delete(LocalChaine,wherex()-x+1,1);
  319.             blanchi(x,wherey(),l);
  320.             cputs(LocalChaine);
  321.             }
  322.         }
  323.       else
  324.         {
  325.         if ( (!Saisie_Escape) & (strlen(LocalChaine)<l) & (carac!=0x0D) )
  326.           {
  327.           Insert(carac,LocalChaine,wherex()-x+1);
  328.           oldx = wherex();
  329.           blanchi(x,y,l);
  330.           cputs(LocalChaine);
  331.           if (strlen(LocalChaine)<l) gotoxy(oldx+1,y);
  332.             else gotoxy(x+l-1,y);
  333.           }
  334.         }
  335.       }
  336.     else
  337.       {
  338.       switch (carac)
  339.         {
  340.         case 0x47: /* Home */
  341.           gotoxy(x,y);
  342.           break;
  343.         case 0x4F: /* End */
  344.           if (strlen(LocalChaine)<l) gotoxy(x+strlen(LocalChaine),y);
  345.             else gotoxy(x+l-1,y);
  346.           break;
  347.         case 0x4B: /* Left Arrow */
  348.           if (wherex()>x) gotoxy(wherex()-1,y);
  349.           break;
  350.         case 0x4D: /* Right Arrow */
  351.           if (wherex()<x+strlen(LocalChaine))
  352.             {
  353.             if (wherex()<x+l-1) gotoxy(wherex()+1,y);
  354.               else gotoxy(x+l-1,y);
  355.             }
  356.           break;
  357.         case 0x53: /* Del */
  358.           delete(LocalChaine,wherex()-x+1,1);
  359.           oldx = wherex();
  360.           blanchi(x,y,l);
  361.           cputs(LocalChaine);
  362.           gotoxy(oldx,y);
  363.         }
  364.       }
  365.     }
  366.   while ( (carac!=0x0D) & (!Saisie_Escape) & (!abandon) );
  367.   textbackground(BLUE);
  368.   oldx = wherex();
  369.   blanchi(x,y,l);
  370.   if ( !(Saisie_Escape|abandon) )
  371.     {
  372.     cputs(LocalChaine);
  373.     gotoxy(oldx,y);
  374.     }
  375.   else gotoxy(x,y);
  376.   if ( (carac==0x0D) & (LocalChaine!="") ) strcpy(chaine,LocalChaine);
  377.   scroll_down();
  378.   }
  379.  
  380.  
  381. void stock_commande_format()
  382.   {
  383.   /* Serial port to use. */
  384.   if (strcmp(commande,"COM1:")==0) voie = '1';
  385.   if (strcmp(commande,"COM2:")==0) voie = '2';
  386.   if (strcmp(commande,"COM3:")==0) voie = '3';
  387.   if (strcmp(commande,"COM4:")==0) voie = '4';
  388.   if (strcmp(commande,"COM5:")==0) voie = '5';
  389.   if (strcmp(commande,"COM6:")==0) voie = '6';
  390.   if (strcmp(commande,"COM7:")==0) voie = '7';
  391.   if (strcmp(commande,"COM8:")==0) voie = '8';
  392.   /* Speed. */
  393.   if (strcmp(commande,"110")==0) vitesse = 110;
  394.   if (strcmp(commande,"150")==0) vitesse = 150;
  395.   if (strcmp(commande,"300")==0) vitesse = 300;
  396.   if (strcmp(commande,"600")==0) vitesse = 600;
  397.   if (strcmp(commande,"1200")==0) vitesse = 1200;
  398.   if (strcmp(commande,"2400")==0) vitesse = 2400;
  399.   if (strcmp(commande,"4800")==0) vitesse = 4800;
  400.   if (strcmp(commande,"9600")==0) vitesse = 9600;
  401.   if (strcmp(commande,"19200")==0) vitesse = 19200;
  402.   if (strcmp(commande,"28800")==0) vitesse = 28800;
  403.   if (strcmp(commande,"38400")==0) vitesse = 38400;
  404.   if (strcmp(commande,"57600")==0) vitesse = 57600;
  405.   if (strcmp(commande,"115200")==0) vitesse = 115200;
  406.   /* Parity. */
  407.   if (strcmp(commande,"N")==0) parity = 'N';
  408.   if (strcmp(commande,"I")==0) parity = 'I';
  409.   if (strcmp(commande,"P")==0) parity = 'P';
  410.   if (strcmp(commande,"T")==0) parity = 'T';
  411.   if (strcmp(commande,"R")==0) parity = 'R';
  412.   /* Bits number. */
  413.   if (strcmp(commande,"5")==0) longueur = '5';
  414.   if (strcmp(commande,"6")==0) longueur = '6';
  415.   if (strcmp(commande,"7")==0) longueur = '7';
  416.   if (strcmp(commande,"8")==0) longueur = '8';
  417.   /* Stop-bit. */
  418.   if (strcmp(commande,"1")==0) stop_bit = '1';
  419.   if (strcmp(commande,"2")==0) stop_bit = '2';
  420.   }
  421.  
  422.  
  423. void setup_ecran_inprog()
  424.   {
  425.   inregs.h.ah = 0x0F;
  426.   int86(0x10,&inregs,&outregs);
  427.   mode_scr = outregs.h.al;
  428.   page_scr = outregs.h.bh;
  429.   if ( (mode_scr==0) | (mode_scr==1) | (mode_scr==2)
  430.        | (mode_scr==3) | (mode_scr==7) )
  431.     {
  432.     xh = wherex();
  433.     yh = wherey();
  434.     if (mode_scr==7) seg_ecran = 0xB000;
  435.       else seg_ecran = 0xB800;
  436.     switch (mode_scr)
  437.       {
  438.       case 0:
  439.       case 1: off_ecran = 40 * 25 * page_scr;
  440.               break;
  441.       case 2:
  442.       case 3:
  443.       case 7: off_ecran = 80 * 25 * page_scr;
  444.       }
  445.     movedata(seg_ecran,off_ecran,FP_SEG(&dos_scr[0]),FP_OFF(&dos_scr[0]),80*25*2);
  446.     }
  447.   if (mode_scr==7) textmode(7);
  448.     else textmode(3);
  449.   inregs.h.al = 0;
  450.   inregs.h.ah = 5;
  451.   int86(0x10,&inregs,&outregs);
  452.   }
  453.  
  454.  
  455. void setup_ecran_outprog()
  456.   {
  457.   inregs.h.al = mode_scr;
  458.   inregs.h.ah = 0;
  459.   int86(0x10,&inregs,&outregs);
  460.   inregs.h.al = page_scr;
  461.   inregs.h.ah = 5;
  462.   int86(0x10,&inregs,&outregs);
  463.   if ( (mode_scr==0) | (mode_scr==1) | (mode_scr==2)
  464.        | (mode_scr==3) | (mode_scr==7) )
  465.     {
  466.     movedata(FP_SEG(&dos_scr[0]),FP_OFF(&dos_scr[0]),seg_ecran,off_ecran,80*25*2);
  467.     gotoxy(xh,yh);
  468.     }
  469.   else clrscr();
  470.   }
  471.  
  472.  
  473. /* ===== POP-UP AND MENUS MANAGEMENT PROCEDURES ===== */
  474.  
  475. /* CopyRight/Help or Infos management procedures. */
  476. /* ---------------------------------------------- */
  477. void informations(byte num_page)
  478.   {
  479.   int  offscr, xinit, yinit;
  480.   char bscr[80 * 15 * 2];
  481.   char help[47 * 15] =
  482.                "┌────TERMINAL.COM──(C)opyRight HETRU 1995────┐ "
  483.                "│ An utility to demonstrate STARCOMM.EXE use │ "
  484.                "│------ Residant driver -> version      -----│ "
  485.                "│F1...Help; F2...Infos/SetUp; F3...modem Cmde│ "
  486.                "│SetUp window (F2) commands to use are:      │ "
  487.                "│ Tab,BackSpace ---> Time-out length select  │ "
  488.                "│ Up/Dn/Lft/Rgt arrows ---> ACTIVE|INACTIVE. │ "
  489.                "│Alt-P...permits to fix the comm. format.    │ "
  490.                "│ port......: COM: number to use (1 to 8),   │ "
  491.                "│ speed.....: between 110 and 115200 bits/sec│ "
  492.                "│ structure.: <Parity>,<Bits_nb>,<Stop_bits> │ "
  493.                "│Alt-F.....sends a test message already seted│ "
  494.                "│Alt-C...........Fully Clears the comm screen│ "
  495.                "│Alt-Q, Ctrl-Break or Ctrl-C...Stops TERMINAL│ "
  496.                "└───────────────Press any key────────────────┘";
  497.   char infos[47 * 15] =
  498.                "┌────────────────────────────────────────────┐ "
  499.                "│ ■  DSR:      CTS:      RI:      DCD:       │ "
  500.                "│ ■ Communication errors accountment:        │ "
  501.                "│       overruns......        occurence(s)   │ "
  502.                "│       parity........        occurence(s)   │ "
  503.                "│       stop-bit......        occurence(s)   │ "
  504.                "│       break-int.....        occurence(s)   │ "
  505.                "│ ■ Receipt TimeOut  ½ 1 2 3 4 5 6 7 8 9 sec.│ "
  506.                "│   Transmit TimeOut ½ 1 2 3 4 5 6 7 8 9 sec.│ "
  507.                "│ ■ Hardware hand-shaking...........         │ "
  508.                "│   Hand-shake Xon(' ')/Xoff(' ')...         │ "
  509.                "│ ■ Local echo......................         │ "
  510.                "│ ■  (1)LF:LFeed (2)CR:LFeed (3)LF|CR:LFeed  │ "
  511.                "│                                            │ "
  512.                "└─────────────'ESC' to escape !──────────────┘";
  513.   byte Init_aff;
  514.   byte H_Shk   ;
  515.   byte *SendOK = 0;
  516.   byte *NbXoff = 0;
  517.   char code[2] = {' ',EOS};
  518.   static byte StatusTOChg = 1;
  519.  
  520.   Init_aff = TRUE;
  521.   choix = ' ';
  522.   xinit = wherex(); yinit = wherey();
  523.   offscr = 5 * 80 * 2;
  524.   movedata(seg_ecran,offscr,FP_SEG(&bscr[0]),FP_OFF(&bscr[0]),80*15*2);
  525.   window(18,6,64,20);
  526.   textbackground(WHITE);
  527.   textcolor(BLACK);
  528.   clrscr();
  529.   gotoxy(1,1);
  530.   switch(num_page)
  531.     {
  532.     case 1:
  533.       {
  534.       cputs(help);
  535.       gotoxy(36,3);
  536.       cputs(ver);
  537.       gotoxy(17,15);
  538.       textbackground(BLACK);
  539.       textcolor(WHITE);
  540.       delay(150);
  541.       cputs("Press any key");
  542.       while (get_clav()==0);
  543.       break;
  544.       }
  545.     case 2:
  546.       {
  547.       cputs(infos);
  548.       textbackground(BLUE);
  549.       textcolor(CYAN);
  550.       gotoxy(2,14);
  551.       cputs("Tab,BackSpace ░ Up/Dn/Lft/Rgt-arrow ░ 1 to 3");
  552.       textbackground(WHITE);
  553.       textcolor(BLACK);
  554.       gotoxy(38,10);
  555.       if ( (HandShake_Status(RTS_CTS,SendOK)==Inactif) &
  556.       (HandShake_Status(DTR_DSR,SendOK)==Inactif) ) cputs("All OFF");
  557.       if (HandShake_Status(RTS_CTS,SendOK)!=Inactif) cputs("RTS/CTS");
  558.       if (HandShake_Status(DTR_DSR,SendOK)!=Inactif) cputs("DTR/DSR");
  559.       gotoxy(38,11);
  560.       if (XonoffShaking_Status(SendOK,NbXoff)!=Inactif) cputs(" ACTIVE ");
  561.         else cputs("INACTIVE");
  562.       gotoxy(38,12);
  563.       if (echo) cputs(" ACTIVE ");
  564.         else cputs("INACTIVE");
  565.       code[0] = (char)Xon;
  566.       gotoxy(21,11);cputs(code);
  567.       code[0] = (char)Xoff;
  568.       gotoxy(31,11);cputs(code);
  569.       gotoxy(15,15);
  570.       textbackground(BLACK);
  571.       textcolor(WHITE);
  572.       delay(150);
  573.       cputs("'ESC' to escape ! ");
  574.       gotoxy(25,4); cputs("     ");
  575.       gotoxy(25,5); cputs("     ");
  576.       gotoxy(25,6); cputs("     ");
  577.       gotoxy(25,7); cputs("     ");
  578.       RdTimMAX[0] = 0;
  579.       WrTimMAX[0] = 0;
  580.       ResetCOM_and_TimMAX(RdTimMAX[0],&OldRdTimMAX,WrTimMAX[0],&OldWrTimMAX);
  581.       RdTimMAX[0] = OldRdTimMAX;
  582.       WrTimMAX[0] = OldWrTimMAX;
  583.       switch (RdTimMAX[0])
  584.         {
  585.         case 1:
  586.           {
  587.           gotoxy(22,8);
  588.           cputs("½");
  589.           break;
  590.           }
  591.         default:
  592.           {
  593.           gotoxy(22+RdTimMAX[0],8);
  594.           result = div(RdTimMAX[0],2);
  595.           TimOut[0] = result.quot + 0x30;
  596.           cputs(&TimOut[0]);
  597.           }
  598.         }
  599.       switch (WrTimMAX[0])
  600.         {
  601.         case 1:
  602.           {
  603.           gotoxy(22,9);
  604.           cputs("½");
  605.           break;
  606.           }
  607.         default:
  608.           {
  609.           gotoxy(22+WrTimMAX[0],9);
  610.           result = div(WrTimMAX[0],2);
  611.           TimOut[0] = result.quot + 0x30;
  612.           cputs(&TimOut[0]);
  613.           }
  614.         }
  615.       if (LF_Used & CR_Used)
  616.         {
  617.         gotoxy(30,13);
  618.         cputs("(3)");
  619.         }
  620.       else
  621.         {
  622.         if (LF_Used)
  623.           {
  624.           gotoxy(6,13);
  625.           cputs("(1)");
  626.           }
  627.         if (CR_Used)
  628.           {
  629.           gotoxy(18,13);
  630.           cputs("(2)");
  631.           }
  632.         }
  633.       switch (StatusTOChg)
  634.         {
  635.         case 1:
  636.           {
  637.           gotoxy(38,10);
  638.           if ( (HandShake_Status(RTS_CTS,SendOK)==Inactif) &
  639.           (HandShake_Status(DTR_DSR,SendOK)==Inactif) ) cputs("All OFF");
  640.           if (HandShake_Status(RTS_CTS,SendOK)!=Inactif) cputs("RTS/CTS");
  641.           if (HandShake_Status(DTR_DSR,SendOK)!=Inactif) cputs("DTR/DSR");
  642.           break;
  643.           }
  644.         case 2:
  645.           {
  646.           gotoxy(38,11);
  647.           if (XonoffShaking_Status(SendOK,NbXoff)!=Inactif) cputs(" ACTIVE ");
  648.             else cputs("INACTIVE");
  649.           break;
  650.           }
  651.         case 3:
  652.           {
  653.           gotoxy(38,12);
  654.           if (echo) cputs(" ACTIVE ");
  655.             else cputs("INACTIVE");
  656.           }
  657.         }
  658.       while ( (choix!=0x1B) & (!abandon) )
  659.         {
  660.         if ( (etat_du_modem()) | Init_aff )
  661.           {
  662.           gotoxy(10,2);
  663.           if (Pret) cputs("YES");
  664.             else
  665.               {
  666.               if (dDSR>0) { cputs("YES"); delay(10); gotoxy(10,2); }
  667.               cputs("No ");
  668.               }
  669.           gotoxy(20,2);
  670.           if (Clear_to_send) cputs("YES");
  671.             else
  672.               {
  673.               if (dCTS>0) { cputs("YES"); delay(10); gotoxy(20,2); }
  674.               cputs("No ");
  675.               }
  676.           gotoxy(29,2);
  677.           if (Sonnerie) cputs("YES");
  678.             else
  679.               {
  680.               if (dRI>0) { cputs("YES"); delay(10); gotoxy(29,2); }
  681.               cputs("No ");
  682.               }
  683.           gotoxy(39,2);
  684.           if (Porteuse) cputs("YES");
  685.             else
  686.               {
  687.               if (dDCD>0) { cputs("YES"); delay(10); gotoxy(39,2); }
  688.               cputs("No ");
  689.               }
  690.           gotoxy(33,15);
  691.           }
  692.         if ( (Errors_Report()) | Init_aff )
  693.           {
  694.           engorge_err = engorge_err + Engorgement;
  695.           pari_err = pari_err + Parite;
  696.           stop_err = stop_err + Stop_bit;
  697.           brkint = brkint + Break_it;
  698.           gotoxy(25,4); printf("%5u",engorge_err);
  699.           gotoxy(25,5); printf("%5u",pari_err);
  700.           gotoxy(25,6); printf("%5u",stop_err);
  701.           gotoxy(25,7); printf("%5u",brkint);
  702.           gotoxy(33,15);
  703.           }
  704.         Init_aff = FALSE;
  705.         if ( (choix=get_clav()) != 0 )
  706.           {
  707.           if (choix==0x08) /* BackSpace: Receipt time-out setting... */
  708.             {
  709.             if (RdTimMAX[0]==1) RdTimMAX[0]++;
  710.               else RdTimMAX[0] = RdTimMAX[0] + 2;
  711.             if (RdTimMAX[0]>18) RdTimMAX[0]=1;
  712.             ResetCOM_and_TimMAX(RdTimMAX[0],&OldRdTimMAX,
  713.               WrTimMAX[0],&OldWrTimMAX);
  714.             textbackground(WHITE);
  715.             textcolor(BLACK);
  716.             gotoxy(22,8);
  717.             cputs("½ 1 2 3 4 5 6 7 8 9");
  718.             textbackground(BLACK);
  719.             textcolor(WHITE);
  720.             switch (RdTimMAX[0])
  721.               {
  722.               case 1:
  723.                 {
  724.                 gotoxy(22,8);
  725.                 cputs("½");
  726.                 break;
  727.                 }
  728.               default:
  729.                 {
  730.                 gotoxy(22+RdTimMAX[0],8);
  731.                 result = div(RdTimMAX[0],2);
  732.                 TimOut[0] = result.quot + 0x30;
  733.                 cputs(&TimOut[0]);
  734.                 }
  735.               }
  736.             }
  737.           if (choix==0x09) /* Tab: Transmit time-out setting... */
  738.             {
  739.             if (WrTimMAX[0]==1) WrTimMAX[0]++;
  740.               else WrTimMAX[0] = WrTimMAX[0] + 2;
  741.             if (WrTimMAX[0]>18) WrTimMAX[0]=1;
  742.             ResetCOM_and_TimMAX(RdTimMAX[0],&OldRdTimMAX,
  743.               WrTimMAX[0],&OldWrTimMAX);
  744.             textbackground(WHITE);
  745.             textcolor(BLACK);
  746.             gotoxy(22,9);
  747.             cputs("½ 1 2 3 4 5 6 7 8 9");
  748.             textbackground(BLACK);
  749.             textcolor(WHITE);
  750.             switch (WrTimMAX[0])
  751.               {
  752.               case 1:
  753.                 {
  754.                 gotoxy(22,9);
  755.                 cputs("½");
  756.                 break;
  757.                 }
  758.               default:
  759.                 {
  760.                 gotoxy(22+WrTimMAX[0],9);
  761.                 result = div(WrTimMAX[0],2);
  762.                 TimOut[0] = result.quot + 0x30;
  763.                 cputs(&TimOut[0]);
  764.                 }
  765.               }
  766.             }
  767.           if ( (choix>='1') & (choix<='3') )
  768.             {
  769.             textbackground(WHITE);
  770.             textcolor(BLACK);
  771.             gotoxy(6,13);
  772.             cputs("(1)");
  773.             gotoxy(18,13);
  774.             cputs("(2)");
  775.             gotoxy(30,13);
  776.             cputs("(3)");
  777.             textbackground(BLACK);
  778.             textcolor(WHITE);
  779.             switch (choix)
  780.               {
  781.               case '1': {
  782.                  gotoxy(6,13);
  783.                  cputs("(1)");
  784.                  LF_Used = TRUE;
  785.                  CR_Used = FALSE;
  786.                  break;
  787.                  }
  788.               case '2': {
  789.                  gotoxy(18,13);
  790.                  cputs("(2)");
  791.                  LF_Used = FALSE;
  792.                  CR_Used = TRUE;
  793.                  break;
  794.                  }
  795.               case '3': {
  796.                  gotoxy(30,13);
  797.                  cputs("(3)");
  798.                  LF_Used = TRUE;
  799.                  CR_Used = TRUE;
  800.                  }
  801.               }
  802.             }
  803.           if ( (choix==0x148) | (choix==0x150) ) /* Flêche haut ou bas */
  804.             {
  805.             if (choix==0x148) StatusTOChg--;
  806.               else StatusTOChg++;
  807.             if (StatusTOChg>3) StatusTOChg=1;
  808.             if (StatusTOChg<1) StatusTOChg=3;
  809.             textbackground(WHITE);
  810.             textcolor(BLACK);
  811.             gotoxy(38,10);
  812.             if ( (HandShake_Status(RTS_CTS,SendOK)==Inactif) &
  813.             (HandShake_Status(DTR_DSR,SendOK)==Inactif) ) cputs("All OFF");
  814.             if (HandShake_Status(RTS_CTS,SendOK)!=Inactif) cputs("RTS/CTS");
  815.             if (HandShake_Status(DTR_DSR,SendOK)!=Inactif) cputs("DTR/DSR");
  816.             gotoxy(38,11);
  817.             if (XonoffShaking_Status(SendOK,NbXoff)!=Inactif) cputs(" ACTIVE ");
  818.               else cputs("INACTIVE");
  819.             gotoxy(38,12);
  820.             if (echo) cputs(" ACTIVE ");
  821.               else cputs("INACTIVE");
  822.             textbackground(BLACK);
  823.             textcolor(WHITE);
  824.             switch (StatusTOChg)
  825.               {
  826.               case 1:
  827.                 {
  828.                 gotoxy(38,10);
  829.                 if ( (HandShake_Status(RTS_CTS,SendOK)==Inactif) &
  830.                 (HandShake_Status(DTR_DSR,SendOK)==Inactif) ) cputs("All OFF");
  831.                 if(HandShake_Status(RTS_CTS,SendOK)!=Inactif) cputs("RTS/CTS");
  832.                 if(HandShake_Status(DTR_DSR,SendOK)!=Inactif) cputs("DTR/DSR");
  833.                 break;
  834.                 }
  835.               case 2:
  836.                 {
  837.                 gotoxy(38,11);
  838.                 if (XonoffShaking_Status(SendOK,NbXoff)!=Inactif)
  839.                   cputs(" ACTIVE ");
  840.                 else cputs("INACTIVE");
  841.                 break;
  842.                 }
  843.               case 3:
  844.                 {
  845.                 gotoxy(38,12);
  846.                 if (echo) cputs(" ACTIVE ");
  847.                   else cputs("INACTIVE");
  848.                 }
  849.               }
  850.             }
  851.           if ( (choix==0x14B) | (choix==0x14D) ) /* Left or right arrow */
  852.             {
  853.             switch (StatusTOChg)
  854.               {
  855.               case 1:
  856.                 {
  857.                 gotoxy(38,10);
  858.                 if (choix==0x14D)
  859.                   {
  860.                   if (HandShake_Status(RTS_CTS,SendOK)!=Inactif)
  861.                     {
  862.                     HandShake_Setup(RTS_CTS,FALSE);
  863.                     HandShake_Setup(DTR_DSR,Bilateral);
  864.                     textbackground(WHITE);
  865.                     textcolor(BLACK);
  866.                     cputs("RTS/CTS");
  867.                     textbackground(BLACK);
  868.                     textcolor(WHITE);
  869.                     gotoxy(38,10);
  870.                     cputs("DTR/DSR");
  871.                     }
  872.                   else
  873.                     {
  874.                     if (HandShake_Status(DTR_DSR,SendOK)!=Inactif)
  875.                       {
  876.                       HandShake_Setup(DTR_DSR,FALSE);
  877.                       textbackground(WHITE);
  878.                       textcolor(BLACK);
  879.                       cputs("DTR/DSR");
  880.                       textbackground(BLACK);
  881.                       textcolor(WHITE);
  882.                       gotoxy(38,10);
  883.                       cputs("All OFF");
  884.                       }
  885.                     else
  886.                       {
  887.                       if ( (HandShake_Status(RTS_CTS,SendOK)==Inactif) &
  888.                       (HandShake_Status(DTR_DSR,SendOK)==Inactif) )
  889.                         {
  890.                         HandShake_Setup(RTS_CTS,Bilateral);
  891.                         textbackground(WHITE);
  892.                         textcolor(BLACK);
  893.                         cputs("All OFF");
  894.                         textbackground(BLACK);
  895.                         textcolor(WHITE);
  896.                         gotoxy(38,10);
  897.                         cputs("RTS/CTS");
  898.                         }
  899.                       }
  900.                     }
  901.                   }
  902.                 else
  903.                   {
  904.                   if (HandShake_Status(RTS_CTS,SendOK)!=Inactif)
  905.                     {
  906.                     HandShake_Setup(RTS_CTS,FALSE);
  907.                     textbackground(WHITE);
  908.                     textcolor(BLACK);
  909.                     cputs("RTS/CTS");
  910.                     textbackground(BLACK);
  911.                     textcolor(WHITE);
  912.                     gotoxy(38,10);
  913.                     cputs("All OFF");
  914.                     }
  915.                   else
  916.                     {
  917.                     if (HandShake_Status(DTR_DSR,SendOK)!=Inactif)
  918.                       {
  919.                       HandShake_Setup(DTR_DSR,FALSE);
  920.                       HandShake_Setup(RTS_CTS,Bilateral);
  921.                       textbackground(WHITE);
  922.                       textcolor(BLACK);
  923.                       cputs("DTR/DSR");
  924.                       textbackground(BLACK);
  925.                       textcolor(WHITE);
  926.                       gotoxy(38,10);
  927.                       cputs("RTS/CTS");
  928.                       }
  929.                     else
  930.                       {
  931.                       if ( (HandShake_Status(RTS_CTS,SendOK)==Inactif) &
  932.                       (HandShake_Status(DTR_DSR,SendOK)==Inactif) )
  933.                         {
  934.                         HandShake_Setup(DTR_DSR,Bilateral);
  935.                         textbackground(WHITE);
  936.                         textcolor(BLACK);
  937.                         cputs("All OFF");
  938.                         textbackground(BLACK);
  939.                         textcolor(WHITE);
  940.                         gotoxy(38,10);
  941.                         cputs("DTR/DSR");
  942.                         }
  943.                       }
  944.                     }
  945.                   }
  946.                 break;
  947.                 }
  948.               case 2:
  949.                 {
  950.                 gotoxy(38,11);
  951.                 if (XonoffShaking_Status(SendOK,NbXoff)!=Inactif)
  952.                   {
  953.                   XonoffShaking_Setup(FALSE);
  954.                   cputs("INACTIVE");
  955.                   }
  956.                 else
  957.                   {
  958.                   XonoffShaking_Setup(Bilateral);
  959.                   cputs(" ACTIVE ");
  960.                   }
  961.                 break;
  962.                 }
  963.               case 3:
  964.                 {
  965.                 echo = ! echo;
  966.                 gotoxy(38,12);
  967.                 if (echo) cputs(" ACTIVE ");
  968.                   else cputs("INACTIVE");
  969.                 }
  970.               }
  971.             } /* End_if */
  972.           } /* End_if */
  973.         gotoxy(33,15);
  974.         } /* End_while */
  975.       choix = ' ';
  976.       } /* End_case_2 */
  977.     } /* End_switch */
  978.   textbackground(BLUE);
  979.   textcolor(WHITE);
  980.   clrscr();
  981.   if (! terminal)
  982.     {
  983.     if (yinit<14) window(1,4,80,13);
  984.       else window(1,15,80,24);
  985.     }
  986.   else window(1,3,80,24);
  987.   movedata(FP_SEG(&bscr[0]),FP_OFF(&bscr[0]),seg_ecran,offscr,80*15*2);
  988.   gotoxy(xinit,yinit);
  989.   }
  990.  
  991.  
  992. /* Utilities procedures. */
  993. /* --------------------- */
  994. void main_menu()
  995.   {
  996.   textbackground(LIGHTGRAY);
  997.   textcolor(BLACK);
  998.   gotoxy(1,25);clreol();
  999.   gotoxy(2,25);
  1000.   cputs(" Alt-Q Quit   Alt-P Parameters   Alt-F Fox...the test message   Alt-C ClrScr");
  1001.   textcolor(RED);
  1002.   gotoxy(3,25);cputs("Alt-Q");
  1003.   gotoxy(16,25);cputs("Alt-P");
  1004.   gotoxy(35,25);cputs("Alt-F");
  1005.   gotoxy(66,25);cputs("Alt-C");
  1006.   }
  1007.  
  1008.  
  1009. void page_de_fond()
  1010.   {
  1011.   textbackground(BLUE);
  1012.   clrscr();
  1013.   textbackground(WHITE);
  1014.   clreol();
  1015.   textbackground(LIGHTGRAY);
  1016.   gotoxy(1,25);
  1017.   clreol();
  1018.   textcolor(MAGENTA);
  1019.   gotoxy(1,1); clreol();
  1020.   cputs(" PROGRAM TO TEST THE ASYNCHRONOUS SERIAL LINK MANAGED BY STARCOMM");
  1021.   cputs(" version ");cputs(ver);
  1022.   if (! terminal)
  1023.     {
  1024.     gotoxy(1,3); cputs("────────────────────────────────");
  1025.     cputs("Transmissions");
  1026.     cputs("───────────────────────────────────");
  1027.     gotoxy(1,14); cputs("──────────────────────────────────");
  1028.     cputs("Receptions");
  1029.     cputs("────────────────────────────────────");
  1030.     }
  1031.   /* Buttom menu. */
  1032.   main_menu();
  1033.   /* Top menu. */
  1034.   textbackground(BLACK);
  1035.   textcolor(LIGHTGRAY);
  1036.   gotoxy(1,2);
  1037.   cputs(" Port:       ▒ Speed:              ▒ Structure: parity    ,    bits,    stop-bit");
  1038.   textbackground(LIGHTGRAY);
  1039.   textcolor(BLACK);
  1040.   gotoxy(9,2); cputs("   ");
  1041.   gotoxy(9,2); printf(" %c ",voie);
  1042.   gotoxy(27,2);
  1043.   switch (vitesse)
  1044.     {
  1045.     case  110: cputs("   110  ");
  1046.                break;
  1047.     case  150: cputs("   150  ");
  1048.                break;
  1049.     case  300: cputs("   300  ");
  1050.                break;
  1051.     case  600: cputs("   600  ");
  1052.                break;
  1053.     case 1200: cputs("  1200  ");
  1054.                break;
  1055.     case 2400: cputs("  2400  ");
  1056.                break;
  1057.     case 4800: cputs("  4800  ");
  1058.                break;
  1059.     case 9600: cputs("  9600  ");
  1060.                break;
  1061.     case 19200: cputs("  19200 ");
  1062.                 break;
  1063.     case 28800: cputs("  28800 ");
  1064.                 break;
  1065.     case 38400: cputs("  38400 ");
  1066.                 break;
  1067.     case 57600: cputs("  57600 ");
  1068.                 break;
  1069.     case 115200: cputs(" 115200 ");
  1070.     }
  1071.   gotoxy(56,2); cputs("   ");
  1072.   gotoxy(60,2); cputs("   ");
  1073.   gotoxy(69,2); cputs("   ");
  1074.   gotoxy(57,2); printf("%c",parity);
  1075.   gotoxy(61,2); printf("%c",longueur);
  1076.   gotoxy(70,2); printf("%c",stop_bit);
  1077.   /* Setting the video parameters for the program. */
  1078.   textbackground(BLUE);
  1079.   if (terminal) window(1,3,80,24);
  1080.     else window(1,4,80,13);
  1081.   gotoxy(1,1);
  1082.   }
  1083.  
  1084.  
  1085. void set_up_menu()
  1086.   {
  1087.   textbackground(LIGHTGRAY);
  1088.   textcolor(BLACK);
  1089.   gotoxy(2,25);clreol();
  1090.   gotoxy(2,25);
  1091.   cputs("  Serial Port       ->Communication speed            Structure       Esc-FIN ");
  1092.   textcolor(RED);
  1093.   gotoxy(11,25);cputs("P");
  1094.   gotoxy(21,25);cputs("V");
  1095.   gotoxy(55,25);cputs("S");
  1096.   gotoxy(71,25);cputs("Esc");
  1097.   }
  1098.  
  1099.  
  1100. Port_serie()
  1101.   {
  1102.   byte previous_voie;
  1103.  
  1104.   choix = 0;
  1105.   /* Buttom menu. */
  1106.   textbackground(LIGHTGRAY);
  1107.   textcolor(BLACK);
  1108.   gotoxy(1,25);clreol();
  1109.   gotoxy(1,25);
  1110.   cputs(" To select the communication port:     to   OR             then");
  1111.   textcolor(RED);
  1112.   gotoxy(38,25); cputs("1");
  1113.   gotoxy(43,25); cputs("8");
  1114.   gotoxy(48,25); cputs("──  or  ──");
  1115.   gotoxy(50,25); printf("%c",16);
  1116.   gotoxy(55,25); printf("%c",17);
  1117.   gotoxy(65,25); cputs("Carriage return");
  1118.   textcolor(BLACK);
  1119.   gotoxy(10,2);
  1120.   /* Choice */
  1121.   while ( (choix!=0x0D) & (!abandon) )
  1122.     {
  1123.     while ( (choix=get_clav()) == 0 );
  1124.     switch (choix)
  1125.       {
  1126.       case '1':
  1127.       case '2':
  1128.       case '3':
  1129.       case '4':
  1130.       case '5':
  1131.       case '6':
  1132.       case '7':
  1133.       case '8':
  1134.         {
  1135.         previous_voie = voie;
  1136.         voie = choix;
  1137.         printf("%c",voie);
  1138.         delay(200);
  1139.         gotoxy(10,2);
  1140.         if (!ComExist[voie-0x31]) resul=1; else resul=0;
  1141.         if (resul!=0)
  1142.           {
  1143.           voie = previous_voie;
  1144.           printf("%c%c",voie,0x07);
  1145.           gotoxy(10,2);
  1146.           }
  1147.         else
  1148.           {
  1149.           erreur = Close_Port(TRUE);
  1150.           CommPort = voie-0x31;
  1151.           erreur = Open_Port();
  1152.           Voie_active = voie;
  1153.           IOStream_WRITE(0,0,0,0,0,0); /* Sets the DEVICE port in use...  */
  1154.           IOStream_WRITE(0,0,0,0,0,0); /* Resets the hand-shakings...     */
  1155.           resul = Init_Port(longueur,stop_bit,parity,vitesse,
  1156.                   &InBuffSz,&OutBuffSz);
  1157.           engorge_err = 0;
  1158.           pari_err = 0;
  1159.           stop_err = 0;
  1160.           brkint = 0;
  1161.           }
  1162.         break;
  1163.         }
  1164.       case 0x14D:
  1165.         {
  1166.         if (voie=='8') voie='1';
  1167.           else voie++;
  1168.         printf("%c",voie);
  1169.         delay(200);
  1170.         gotoxy(10,2);
  1171.         if (!ComExist[voie-0x31]) resul=1; else resul=0;
  1172.         if (resul!=0)
  1173.           {
  1174.           if (voie=='1') voie='8';
  1175.             else voie--;
  1176.           printf("%c%c",voie,0x07);
  1177.           gotoxy(10,2);
  1178.           }
  1179.         else
  1180.           {
  1181.           erreur = Close_Port(TRUE);
  1182.           CommPort = voie-0x31;
  1183.           erreur = Open_Port();
  1184.           Voie_active = voie;
  1185.           IOStream_WRITE(0,0,0,0,0,0); /* Sets the DEVICE port in use...  */
  1186.           IOStream_WRITE(0,0,0,0,0,0); /* Resets the hand-shakings...     */
  1187.           resul = Init_Port(longueur,stop_bit,parity,vitesse,
  1188.                   &InBuffSz,&OutBuffSz);
  1189.           engorge_err = 0;
  1190.           pari_err = 0;
  1191.           stop_err = 0;
  1192.           brkint = 0;
  1193.           }
  1194.         break;
  1195.         }
  1196.       case 0x14B:
  1197.         {
  1198.         if (voie=='1') voie='8';
  1199.           else voie--;
  1200.         printf("%c",voie);
  1201.         delay(200);
  1202.         gotoxy(10,2);
  1203.         if (!ComExist[voie-0x31]) resul=1; else resul=0;
  1204.         if (resul!=0)
  1205.           {
  1206.           if (voie=='8') voie='1';
  1207.             else voie++;
  1208.           printf("%c%c",voie,0x07);
  1209.           gotoxy(10,2);
  1210.           }
  1211.         else
  1212.           {
  1213.           erreur = Close_Port(TRUE);
  1214.           CommPort = voie-0x31;
  1215.           erreur = Open_Port();
  1216.           Voie_active = voie;
  1217.           IOStream_WRITE(0,0,0,0,0,0); /* Sets the DEVICE port in use...  */
  1218.           IOStream_WRITE(0,0,0,0,0,0); /* Resets the hand-shakings...     */
  1219.           resul = Init_Port(longueur,stop_bit,parity,vitesse,
  1220.                   &InBuffSz,&OutBuffSz);
  1221.           engorge_err = 0;
  1222.           pari_err = 0;
  1223.           stop_err = 0;
  1224.           brkint = 0;
  1225.           }
  1226.         }
  1227.       }
  1228.     }
  1229.   }
  1230.  
  1231.  
  1232. vitesse_setup()
  1233.   {
  1234.   long vitesse0;
  1235.  
  1236.   choix = 0;
  1237.   vitesse0 = vitesse;
  1238.   /* Buttom menu. */
  1239.   textbackground(LIGHTGRAY);
  1240.   textcolor(BLACK);
  1241.   gotoxy(1,25);
  1242.   cputs(" To select the transmission speed, use:                then                  ");
  1243.   textcolor(RED);
  1244.   gotoxy(44,25); cputs("──  or  ──");
  1245.   gotoxy(46,25); printf("%c",16);
  1246.   gotoxy(51,25); printf("%c",17);
  1247.   gotoxy(61,25); cputs("Carriage return");
  1248.   textcolor(BLACK);
  1249.   gotoxy(27,2);
  1250.   /* Choice */
  1251.   while ( (choix!=0x0D) & (!abandon) )
  1252.     {
  1253.     while ( (choix=get_clav()) == 0 );
  1254.     if (choix==0x14D)
  1255.       {
  1256.       switch (vitesse)
  1257.         {
  1258.         case  110: vitesse = 150;
  1259.                    cputs("   150  ");
  1260.                    break;
  1261.         case  150: vitesse = 300;
  1262.                    cputs("   300  ");
  1263.                    break;
  1264.         case  300: vitesse = 600;
  1265.                    cputs("   600  ");
  1266.                    break;
  1267.         case  600: vitesse = 1200;
  1268.                    cputs("  1200  ");
  1269.                    break;
  1270.         case 1200: vitesse = 2400;
  1271.                    cputs("  2400  ");
  1272.                    break;
  1273.         case 2400: vitesse = 4800;
  1274.                    cputs("  4800  ");
  1275.                    break;
  1276.         case 4800: vitesse = 9600;
  1277.                    cputs("  9600  ");
  1278.                    break;
  1279.         case 9600: vitesse = 19200;
  1280.                    cputs("  19200 ");
  1281.                    break;
  1282.         case 19200: vitesse = 28800;
  1283.                    cputs("  28800 ");
  1284.                    break;
  1285.         case 28800: vitesse = 38400;
  1286.                    cputs("  38400 ");
  1287.                    break;
  1288.         case 38400: vitesse = 57600;
  1289.                    cputs("  57600 ");
  1290.                    break;
  1291.         case 57600: vitesse = 115200;
  1292.                    cputs(" 115200 ");
  1293.                    break;
  1294.         case 115200: vitesse = 110;
  1295.                    cputs("   110  ");
  1296.         }
  1297.       gotoxy(27,2);
  1298.       }
  1299.     if (choix==0x14B)
  1300.       {
  1301.       switch (vitesse)
  1302.         {
  1303.         case  110: vitesse = 115200;
  1304.                    cputs(" 115200 ");
  1305.                    break;
  1306.         case  150: vitesse = 110;
  1307.                    cputs("   110  ");
  1308.                    break;
  1309.         case  300: vitesse = 150;
  1310.                    cputs("   150  ");
  1311.                    break;
  1312.         case  600: vitesse = 300;
  1313.                    cputs("   300  ");
  1314.                    break;
  1315.         case 1200: vitesse = 600;
  1316.                    cputs("   600  ");
  1317.                    break;
  1318.         case 2400: vitesse = 1200;
  1319.                    cputs("  1200  ");
  1320.                    break;
  1321.         case 4800: vitesse = 2400;
  1322.                    cputs("  2400  ");
  1323.                    break;
  1324.         case 9600: vitesse = 4800;
  1325.                    cputs("  4800  ");
  1326.                    break;
  1327.         case 19200: vitesse = 9600;
  1328.                    cputs("  9600  ");
  1329.                    break;
  1330.         case 28800: vitesse = 19200;
  1331.                    cputs("  19200 ");
  1332.                    break;
  1333.         case 38400: vitesse = 28800;
  1334.                    cputs("  28800 ");
  1335.                    break;
  1336.         case 57600: vitesse = 38400;
  1337.                    cputs("  38400 ");
  1338.                    break;
  1339.         case 115200: vitesse = 57600;
  1340.                    cputs("  57600 ");
  1341.         }
  1342.       gotoxy(27,2);
  1343.       }
  1344.     }
  1345.   /* Setting the new communication speed. */
  1346.   resul = Init_Port(longueur,stop_bit,parity,vitesse,&InBuffSz,&OutBuffSz);
  1347.   /* If new value is denied, we reset the preceding value. */
  1348.   if (resul!=0)
  1349.     {
  1350.     vitesse = vitesse0;
  1351.     gotoxy(27,2);
  1352.     cputs("  9600 ");
  1353.     Init_Port(longueur,stop_bit,parity,vitesse,&InBuffSz,&OutBuffSz);
  1354.     }
  1355.   }
  1356.  
  1357.  
  1358. structure_octet()
  1359.   {
  1360.   int  xpos;
  1361.   char element;  /* parity, nb-bytes or stop-bit. */
  1362.  
  1363.   element = PARITE;
  1364.   choix = 0;
  1365.   xpos = 57;
  1366.   /* Buttom menu. */
  1367.   textbackground(LIGHTGRAY);
  1368.   textcolor(BLACK);
  1369.   gotoxy(1,25);
  1370.   cputs(" To select the structure of the bytes, use:              then                ");
  1371.   textcolor(RED);
  1372.   gotoxy(45,25); cputs("Space  ─ | ─");
  1373.   gotoxy(53,25); printf("%c",16);
  1374.   gotoxy(55,25); printf("%c",17);
  1375.   gotoxy(63,25); cputs("Carriage return");
  1376.   textcolor(BLACK);
  1377.   gotoxy(xpos,2);
  1378.   /* Choice */
  1379.   while ( (choix!=0x0D) & (!abandon) )
  1380.     {
  1381.     while ( (choix=get_clav()) == 0 );
  1382.     switch (choix)
  1383.       {
  1384.       case 0x14D: switch (element)  /* Right arrow */
  1385.                   {
  1386.                   case PARITE:
  1387.                     switch (parity)
  1388.                       {
  1389.                       case 'N': parity = 'P';
  1390.                                 cputs("P");
  1391.                                 break;
  1392.                       case 'P': parity = 'I';
  1393.                                 cputs("I");
  1394.                                 break;
  1395.                       case 'I': parity = 'T';
  1396.                                 cputs("T");
  1397.                                 break;
  1398.                       case 'T': parity = 'R';
  1399.                                 cputs("R");
  1400.                                 break;
  1401.                       case 'R': parity = 'N';
  1402.                                 cputs("N");
  1403.                       }
  1404.                     break;
  1405.                   case NBOCTETS:
  1406.                     switch (longueur)
  1407.                       {
  1408.                       case '5': longueur = '6';
  1409.                                 cputs("6");
  1410.                                 break;
  1411.                       case '6': longueur = '7';
  1412.                                 cputs("7");
  1413.                                 break;
  1414.                       case '7': longueur = '8';
  1415.                                 cputs("8");
  1416.                                 break;
  1417.                       case '8': longueur = '5';
  1418.                                 cputs("5");
  1419.                       }
  1420.                     break;
  1421.                   case STOPBIT:
  1422.                     switch (stop_bit)
  1423.                       {
  1424.                       case '2': stop_bit = '1';
  1425.                                 cputs("1");
  1426.                                 break;
  1427.                       case '1': stop_bit = '2';
  1428.                                 cputs("2");
  1429.                       }
  1430.                   }
  1431.                 break;
  1432.       case 0x14B: switch (element)  /* Left arrow */
  1433.                   {
  1434.                   case PARITE:
  1435.                     switch (parity)
  1436.                       {
  1437.                       case 'N': parity = 'R';
  1438.                                 cputs("R");
  1439.                                 break;
  1440.                       case 'P': parity = 'N';
  1441.                                 cputs("N");
  1442.                                 break;
  1443.                       case 'I': parity = 'P';
  1444.                                 cputs("P");
  1445.                                 break;
  1446.                       case 'T': parity = 'I';
  1447.                                 cputs("I");
  1448.                                 break;
  1449.                       case 'R': parity = 'T';
  1450.                                 cputs("T");
  1451.                       }
  1452.                     break;
  1453.                   case NBOCTETS:
  1454.                     switch (longueur)
  1455.                       {
  1456.                       case '5': longueur = '8';
  1457.                                 cputs("8");
  1458.                                 break;
  1459.                       case '6': longueur = '5';
  1460.                                 cputs("5");
  1461.                                 break;
  1462.                       case '7': longueur = '6';
  1463.                                 cputs("6");
  1464.                                 break;
  1465.                       case '8': longueur = '7';
  1466.                                 cputs("7");
  1467.                       }
  1468.                     break;
  1469.                   case STOPBIT:
  1470.                     switch (stop_bit)
  1471.                       {
  1472.                       case '2': stop_bit = '1';
  1473.                                 cputs("1");
  1474.                                 break;
  1475.                       case '1': stop_bit = '2';
  1476.                                 cputs("2");
  1477.                       }
  1478.                   }
  1479.                 break;
  1480.       case ' ': element++;
  1481.                 if (element>STOPBIT) element=PARITE;
  1482.       }
  1483.     switch (element)
  1484.       {
  1485.       case PARITE:
  1486.          xpos = 57;
  1487.          break;
  1488.       case NBOCTETS:
  1489.          xpos = 61;
  1490.          break;
  1491.        case STOPBIT:
  1492.          xpos = 70;
  1493.       }
  1494.     gotoxy(xpos,2);
  1495.     }
  1496.   /* Setting the new structure. */
  1497.   resul = Init_Port(longueur,stop_bit,parity,vitesse,&InBuffSz,&OutBuffSz);
  1498.   /* If the new structure is denied, we reset the preceding value. */
  1499.   if (resul!=0)
  1500.     {
  1501.     parity = 'N';
  1502.     longueur = '8';
  1503.     stop_bit = '1';
  1504.     Init_Port(longueur,stop_bit,parity,vitesse,&InBuffSz,&OutBuffSz);
  1505.     gotoxy(57,2); cputs("N");
  1506.     gotoxy(61,2); cputs("8");
  1507.     gotoxy(70,2); cputs("1");
  1508.     }
  1509.   }
  1510.  
  1511.  
  1512. void set_up()
  1513.   {
  1514.   int x,y;
  1515.  
  1516.   choix = 0;
  1517.   /* Buttom menu. */
  1518.   x=wherex(); y=wherey();
  1519.   window(1,1,80,25);
  1520.   set_up_menu();
  1521.   /* Choices storing. */
  1522.   while ( (choix!=0x1B) & (!abandon) )
  1523.     {
  1524.     while ( (choix=get_clav()) == 0 );
  1525.     switch(choix)
  1526.       {
  1527.       case 0x13B: /* CopyRight and help: F1 */
  1528.              informations(1);
  1529.              window(1,1,80,25);
  1530.              break;
  1531.       case 0x13C: /* Informations: F2 */
  1532.              informations(2);
  1533.              window(1,1,80,25);
  1534.              break;
  1535.       case 0x50: /* Serial port */
  1536.       case 0x70:
  1537.              Port_serie();
  1538.              break;
  1539.       case 0x56: /* Speed */
  1540.       case 0x76:
  1541.              vitesse_setup();
  1542.              break;
  1543.       case 0x53: /* Structure */
  1544.       case 0x73:
  1545.              structure_octet();
  1546.       }
  1547.     set_up_menu();
  1548.     }
  1549.   /* Initial screen status is restored. */
  1550.   main_menu();
  1551.   textbackground(BLUE);
  1552.   if (! terminal)
  1553.     {
  1554.     if (y<14) window(1,4,80,13);
  1555.       else window(1,15,80,24);
  1556.     }
  1557.   else window(1,3,80,24);
  1558.   gotoxy(x,y);
  1559.   }
  1560.  
  1561.  
  1562. void ModemCmde()
  1563.   {
  1564.   char StringCmde[MAXStrLen];
  1565.   char CarriageRtn[2];
  1566.  
  1567.   textcolor(WHITE);
  1568.   if (wherex()!=1) scroll_down();
  1569.   cputs("Modem command to send: ");
  1570.   strcpy(StringCmde,"AT");
  1571.   Lit_chaine(StringCmde,wherex(),wherey(),StrLen);
  1572.   if ( (StringCmde!="") & (!Saisie_Escape) & (!abandon) )
  1573.     {
  1574.     CarriageRtn[0] = cr;
  1575.     CarriageRtn[1] = EOS;
  1576.     strcat(StringCmde,CarriageRtn);
  1577.     if (WriteCmde(StringCmde,strlen(StringCmde),TRUE) != 0)
  1578.       {
  1579.       cputs("An error occured when sending this command.");
  1580.       scroll_down();
  1581.       }
  1582.     }
  1583.   }
  1584.  
  1585.  
  1586. void traitement_affichage(char caractere)
  1587.   {
  1588.   char car[1];
  1589.  
  1590.   car[0] = caractere;
  1591.   car[1] = 0;
  1592.   switch (caractere)
  1593.     {
  1594.     case 0x03: break;
  1595.     case 0x0C: {
  1596.                if (! terminal) window(1,15,80,24);
  1597.                clrscr();
  1598.                if (! terminal) window(1,4,80,13);
  1599.                break;
  1600.                }
  1601.     case 0x0A: if (LF_Used) scroll_down();
  1602.                break;
  1603.     case 0x0D: if (CR_Used) scroll_down();
  1604.                break;
  1605.     case 0x08: {
  1606.                cputs(car);
  1607.                cputs(" ");
  1608.                cputs(car);
  1609.                break;
  1610.                }
  1611.     case 0x09: cputs("     ");
  1612.                break;
  1613.     default:   cputs(car);
  1614.     }
  1615.   }
  1616.  
  1617.  
  1618. void traitement_clavier()
  1619.   {
  1620.   int  code;
  1621.   char fox[1] = " ";
  1622.   char fox_message[70] =
  1623.   "The Quick Brown Fox Jumped Over The Lazy Dog's Back 0123456789 Times !";
  1624.  
  1625.   code = get_clav();
  1626.   switch (code)
  1627.     {
  1628.     case 0x110: /* Quit */
  1629.                 {
  1630.                 fin = TRUE;
  1631.                 break;
  1632.                 }
  1633.     case 0x13B: /* CopyRight and Help: F1 */
  1634.                 {
  1635.                 informations(1);
  1636.                 break;
  1637.                 }
  1638.     case 0x13C: /* Informations: F2 */
  1639.                 {
  1640.                 informations(2);
  1641.                 break;
  1642.                 }
  1643.     case 0x13D: /* Modem command: F3 */
  1644.                 {
  1645.                 ModemCmde();
  1646.                 break;
  1647.                 }
  1648.     case 0x119: /* Parameters */
  1649.                 {
  1650.                 set_up();
  1651.                 break;
  1652.                 }
  1653.     case 0x121: /* Fox message */
  1654.                 {
  1655.                 textcolor(YELLOW);
  1656.                 fox[1] = 0;
  1657.                 IO_err = FALSE;
  1658.                 erreur = WriteCOMM(&cr,1);
  1659.                 if ( (erreur==0) & (!IO_err) & echo ) scroll_down();
  1660.                 n_car=0;
  1661.                 while ( (erreur==0) & (!IO_err) & (n_car<77) )
  1662.                   {
  1663.                   if (Lent) delay(T_Delay);
  1664.                   erreur = WriteCOMM(&fox_message[n_car],1);
  1665.                   if ( (erreur==0) & (!IO_err) & echo )
  1666.                     {
  1667.                     fox[0] = fox_message[n_car];
  1668.                     cputs(fox);
  1669.                     }
  1670.                   n_car++;
  1671.                   }
  1672.                 break;
  1673.                 }
  1674.     case 0x12E: /* Clearing all the screens (local send */
  1675.                 /* and remote receipt...).              */
  1676.                 {
  1677.                 textcolor(YELLOW);
  1678.                 IO_err = FALSE;
  1679.                 erreur = WriteCOMM(&clrscreen,1);
  1680.                 if ( (!IO_err) & (erreur==0) ) clrscr();
  1681.                 break;
  1682.                 }
  1683.     default: /* Sending and writting the next keypressed character... */
  1684.              {
  1685.              IO_err = FALSE;
  1686.              erreur = WriteCOMM(&(char)code,1);
  1687.              if ( (!IO_err) & (erreur==0) & echo )
  1688.                {
  1689.                textcolor(YELLOW);
  1690.                traitement_affichage((char)code);
  1691.                }
  1692.              }
  1693.     }
  1694.   }
  1695.  
  1696.  
  1697. /* ===== MAIN PROCEDURE OF THE PROGRAM ===== */
  1698.  
  1699. main(int argc, char *argv[])
  1700.   {
  1701.   byte i,j,k              ;
  1702.   char NomPeriph[9]       ;
  1703.   char argument[127]      ;
  1704.   char beep_error = FALSE ;
  1705.   int  *hold_1b           ;
  1706.   char carac_recu         ;
  1707.   char deb_message[47] = "Your communication partner has just hang off...";
  1708.   int OldXpos,OldYpos     ;
  1709.   static int Xpos = 1     ;
  1710.   static int Ypos = 1     ;
  1711.   byte *SendOK = 0        ;
  1712.   byte *NbXoff = 0        ;
  1713.  
  1714.   erreur = Check_STARCOMM_Present();
  1715.   switch (erreur)
  1716.     {
  1717.     case 0:
  1718.     case 1:
  1719.       {
  1720.       erreur = 200;
  1721.       break;
  1722.       }
  1723.     case 2:
  1724.       {
  1725.       Version(ver);
  1726.       j=0;
  1727.       for (i=0;i<8;i++)
  1728.         {
  1729.         CommPort=i;
  1730.         Port_Opened();
  1731.         if (ComExist[CommPort])
  1732.           {
  1733.           ResetCOM_and_TimMAX(RdTimMAX[0],&OldRdTimMAX,
  1734.             WrTimMAX[0],&OldWrTimMAX);
  1735.           j++;
  1736.           Close_Port(TRUE);
  1737.           }
  1738.         }
  1739.       if (j==0)
  1740.         erreur = 300;
  1741.       else
  1742.         {
  1743.         CommPort = 0;
  1744.         while (!ComExist[CommPort]) CommPort++;
  1745.         voie = CommPort+0x31;
  1746.         ResetPortDevice();
  1747.         erreur = Open_COMM();
  1748.         }
  1749.       }
  1750.     }
  1751.  
  1752.   if (erreur==0)
  1753.     {
  1754.     OldIBreak = getvect(Int1B);
  1755.     setvect(Int1B,CtrlBreak);
  1756.     OldIError = getvect(Int24);
  1757.     setvect(Int24,IError);
  1758.     for(i=1;i<argc;i++)
  1759.       {
  1760.       strcpy(argument,strupr(argv[i]));
  1761.       for (j=0;j<=strlen(argument) & argument[j]!=':' & argument[j]!=',';j++)
  1762.         commande[j] = argument[j];
  1763.       if (argument[j]==':')
  1764.         {
  1765.         commande[j] = argument[j];
  1766.         j++;
  1767.         }
  1768.       commande[j] = EOS;
  1769.       stock_commande_format();
  1770.       while (j<strlen(argument) & argument[j]!='/')
  1771.         {
  1772.         k=0;
  1773.         for (j=j;j<=strlen(argument) & argument[j]!=',' & argument[j]!='/';j++)
  1774.           {
  1775.           commande[k] = argument[j];
  1776.           k++;
  1777.           }
  1778.         if (argument[j]==',') j++;
  1779.         commande[k] = EOS;
  1780.         stock_commande_format();
  1781.         }
  1782.       }
  1783.     for (i=1;i<argc;i++)
  1784.       {
  1785.       strcpy(argument,strupr(argv[i]));
  1786.       j = 0;
  1787.       while (j<=strlen(argument))
  1788.         {
  1789.         for (j=j;j<=strlen(argument) & argument[j]!='/';j++);
  1790.         if (argument[j]=='/')
  1791.           {
  1792.           j++;
  1793.           if (argument[j]=='/') j++;
  1794.           k = 0;
  1795.           while(j<=strlen(argument) & argument[j]!='/' & argument[j]!=' ')
  1796.             {
  1797.             commande[k] = argument[j];
  1798.             k++;
  1799.             j++;
  1800.             }
  1801.           j--;
  1802.           commande[k] = EOS;
  1803.           if (strcmp(strupr(commande),"TERMINAL")==0) terminal = TRUE;
  1804.           if (strcmp(strupr(commande),"T")==0) terminal = TRUE;
  1805.           if (strcmp(strupr(commande),"ALARME")==0) beep_error = TRUE;
  1806.           if (strcmp(strupr(commande),"A")==0) beep_error = TRUE;
  1807.           if (strcmp(strupr(commande),"RALENTI")==0) Lent = TRUE;
  1808.           if (strcmp(strupr(commande),"R")==0) Lent = TRUE;
  1809.           }
  1810.         }
  1811.       }
  1812.     Close_Port(TRUE);
  1813.     if (!ComExist[voie-0x31])
  1814.       {
  1815.       CommPort = 0;
  1816.       while (!ComExist[CommPort]) CommPort++;
  1817.       voie = CommPort+0x31;
  1818.       }
  1819.     else CommPort=voie-0x31;
  1820.     erreur = Open_Port();
  1821.     Voie_active = voie;
  1822.     IOStream_WRITE(0,0,0,0,0,0);
  1823.     resul = Init_Port(longueur,stop_bit,parity,vitesse,&InBuffSz,&OutBuffSz);
  1824.     HandShake_Setup(RTS_CTS,FALSE);
  1825.     HandShake_Setup(DTR_DSR,FALSE);
  1826.     XonoffShaking_Setup(FALSE);
  1827.     setup_ecran_inprog();
  1828.     page_de_fond();
  1829.     IO_err = FALSE;
  1830.     erreur = WriteCOMM(&cr,1);
  1831.     n_car=0;
  1832.     while ( (IO_err==FALSE) & (erreur==0) & (n_car<45) )
  1833.       {
  1834.       if (Lent) delay(T_Delay);
  1835.       erreur = WriteCOMM(&deb_message[n_car],1);
  1836.       n_car++;
  1837.       }
  1838.     if ( (IO_err==FALSE) & (erreur==0) ) erreur = WriteCOMM(&cr,1);
  1839.     if ( (IO_err==FALSE) & (erreur==0) ) erreur = WriteCOMM(&cr,1);
  1840.     informations(1);
  1841.  
  1842.     while ( (!fin) & (!abandon) )
  1843.       {
  1844.       if (CheckCOMMIn())
  1845.         {
  1846.         IO_err = FALSE;
  1847.         ReadCOMM(&carac_recu,1);
  1848.         if (carac_recu==0x1A)
  1849.           {
  1850.           if (!terminal)
  1851.             {
  1852.             OldXpos = wherex();
  1853.             OldYpos = wherey();
  1854.             window(1,15,80,24);
  1855.             gotoxy(Xpos,Ypos);
  1856.             }
  1857.           textcolor(GREEN);
  1858.           erreur = Close_COMM();
  1859.           erreur = Open_COMM();
  1860.           IO_err = TRUE;
  1861.           textcolor(LIGHTGRAY);
  1862.           scroll_down();
  1863.           cputs("EOF received: your partner has probably disconnected !");
  1864.           scroll_down();
  1865.           if (!terminal)
  1866.             {
  1867.             Xpos = wherex();
  1868.             Ypos = wherey();
  1869.             window(1,4,80,13);
  1870.             gotoxy(OldXpos,OldYpos);
  1871.             }
  1872.           }
  1873.         if (IO_err==FALSE)
  1874.           {
  1875.           if (!terminal)
  1876.             {
  1877.             OldXpos = wherex();
  1878.             OldYpos = wherey();
  1879.             window(1,15,80,24);
  1880.             gotoxy(Xpos,Ypos);
  1881.             }
  1882.           textcolor(GREEN);
  1883.           traitement_affichage(carac_recu);
  1884.           if (!terminal)
  1885.             {
  1886.             Xpos = wherex();
  1887.             Ypos = wherey();
  1888.             window(1,4,80,13);
  1889.             gotoxy(OldXpos,OldYpos);
  1890.             }
  1891.           }
  1892.         }
  1893.       if (beep_error==TRUE)
  1894.         {
  1895.         if (Errors_Report())
  1896.           {
  1897.           engorge_err = engorge_err + Engorgement;
  1898.           pari_err = pari_err + Parite;
  1899.           stop_err = stop_err + Stop_bit;
  1900.           brkint = brkint + Break_it;
  1901.           sound(100);
  1902.           delay(50);
  1903.           nosound();
  1904.           }
  1905.         }
  1906.       while (kb_hit()) traitement_clavier();
  1907.       if (XonoffShaking_Status(SendOK,NbXoff)!=Inactif)
  1908.         {
  1909.         if ( (!SendOK) & (*NbXoff>50) ) XonoffShaking_Setup(Bilateral);
  1910.         }
  1911.       }
  1912.  
  1913.     window(1,1,80,25);
  1914.     textcolor(LIGHTGRAY);
  1915.     textbackground(BLACK);
  1916.     setup_ecran_outprog();
  1917.     printf(">TERMINAL [<Comm format>][<options>]\n");
  1918.     printf("  <Comm fmt>=COMi:speed,parity,bits,stp\n");
  1919.     printf("  /T = Terminal: full screen emulation.\n");
  1920.     printf("  /A = <A>larm if any receipt error.\n");
  1921.     printf("  /R = Slow down all transmitting...\n");
  1922.     printf("      (when linking to a very slow PC:\n");
  1923.     printf("      more and more overrun errors DO\n");
  1924.     printf("      occurs on the slowest station !).\n\n");
  1925.     erreur = Close_COMM();
  1926.     i=0;
  1927.     while ( (i<8) & (NomDevice[i]!=' ') )
  1928.       {
  1929.       NomPeriph[i] = NomDevice[i];
  1930.       i++;
  1931.       }
  1932.     NomPeriph[i] = 0;
  1933.     setvect(Int1B,OldIBreak);
  1934.     setvect(Int24,OldIError);
  1935.     if (!erreur)
  1936.       {
  1937.       if (Attend_Buff_ems_vide(10)!=0)
  1938.         printf("Transmit buffer is NOT empty !\n");
  1939.       erreur = Close_Port(TRUE);
  1940.       printf("Program has stoped ");
  1941.       if (abandon) printf("on a CtrlBreak");
  1942.         else
  1943.           if (!erreur) printf("normally");
  1944.             else printf("(port is open !)");
  1945.       printf(".\n%s: file is closed.\n",NomPeriph);
  1946.       }
  1947.     else printf("Error--> %s: file NOT closed...\n",NomPeriph);
  1948.     }
  1949.   else
  1950.     {
  1951.     switch(erreur)
  1952.       {
  1953.       case 200:
  1954.         {
  1955.         printf("STARCOMM was not found as a DEVICE!\n");
  1956.         printf("Please, use:  DEVICE = STARCOMM.EXE\n");
  1957.         printf("in your CONFIG.SYS, then boot-up...\n");
  1958.         break;
  1959.         }
  1960.       case 300:
  1961.         {
  1962.         printf("Error--> NO USABLE PORT !\n");
  1963.         printf("TERMINAL was interrupted.\n");
  1964.         break;
  1965.         }
  1966.       default: printf("DOS error number %i !\n",erreur);
  1967.       }
  1968.     }
  1969.   }
  1970.